Service Injecting¶
Sono presenti vari modi per poter utilizzare i servizi registrati nell’applicativo ma uno dei più performanti e comodi è chiamato Service Injecting e consiste nella richiesta di un servizio tramite la dichiarazione di un parametro o di un costruttore
Nota
Resta comunque possibile l’utilizzo dei servizi registrati attraverso il ServiceProvider correlato. Esso può essere
trovato nell”HttpContext
nella proprietà RequestServices
oppure nell”IApplicationBuilder
nella proprietà
ApplicationServices
- In applicativi ASP.NET Core sono presenti principalmente tre tipi di injecting supportati
- Costruttore
L’injecting per costruttore consiste nell’inserire i servizi richiesti nel costruttore di un proprio servizio/controller e di lasciar fare al ServiceProvider la risoluzione e validazione dei servizi necessari
public HomeController(SomeFancyService fancyService, SomeFancyOptionalService fancy = null) { _fancyService = fancyService; _fancy = fancy; }
- Annotation
L’injecting per annotation è consentito solo nei controller e permette di usare servizi specifici per una data azione senza doverli risolvere ad ogni richiesta per tutte le azioni del controller.
Per richiedere un servizio è sufficiente aggiungerlo come parametro e annotarlo con l’attributo
FromServices
private IActionResult GetData( [FromQuery] string paramter, [FromServices] DataProvider provider, [FromServices] OptionalService service = null) { // Some fancy stuff return aResultVariable; }
- Razor
L’injecting per le pagine o view Razor, invece, si svolge tramite la langword
@inject
nella sintassi@inject SomeService SomeVariableName
che renderà disponibile il servizio richiesto nella pagina nella proprietà con il nome specificatoNota
Quando in una pagina razor viene definito un servizio l’engine aggiungerà il servizio richiesto al costruttore della pagina e ne assegnerà il valore ad una proprietà protetta (readonly) con il nome scelto
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
namespace Example.Controllers {
[Authorize]
public class HomeController : Controller {
private readonly SomeFancyService _fancyService;
[CanBeNull]
private readonly SomeFancyOptionalService _fancy;
public HomeController(SomeFancyService fancyService, SomeFancyOptionalService fancy = null) {
_fancyService = fancyService;
_fancy = fancy;
}
public IActionResult Index() {
return View();
}
[HttpGet("FancyData")]
private IActionResult GetData(
[FromQuery] string paramter,
[FromServices] DataProvider provider,
[FromServices] OptionalService service = null) {
// Some fancy stuff
return aResultVariable;
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true), Route("error")]
public IActionResult Error() {
return View(new ErrorViewModel {RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier});
}
}
}
|
Nota
Per dichiarare un servizio come opzionale sarà sufficiente segnare il parametro come opzionale (vedi riga 15 e 28)